package com.itheima.Demo03;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;
@SuppressWarnings("all")
public class MyCollections {
    //定义一个方法
    //我们这个方法
    //参数 【原始对象】      返回值【代理对象】
    public static List<String> method(List<String> list) {
        //动态代理
        /*
            参数：
                ClassLoader loader,         类加载器,固定写法
                Class<?>[] interfaces,      接口,固定写法
                InvocationHandler h         处理方式,用匿名内部类(或者用Lambda)
            返回值：
                Object  代表:代理对象
         */
        List<String> list2  = (List<String>)Proxy.newProxyInstance(list.getClass().getClassLoader(), list.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                /*
                当使用代理对象调用任何方法时,都会进入到invoke方法来
                    参数：
                        Object proxy    代理对象,在这里不用这个对象
                        Method method   被调用的方法
                        Object[] args   调用方法时传入实际参数

                    返回值：
                        Object 代表执行方法之后结果
                                比如执行的是集合的size方法那么这个返回值就应该是整数
                                比如执行的是get方法那么方法的返回值就应该是集合的元素类型
             */
                //不让执行增删改
                if(method.getName().equals("add")||method.getName().equals("remove")||method.getName().equals("set")){
                    //产生异常提醒;
                    throw new RuntimeException("不能进行增删改等操作");

                }
                //如果不是增删改的话 就让程序正常执行
                Object invoke = method.invoke(list, objects);
                return invoke;
            }
        });
        return list2;


    }
}
